package com.yssoft.service.core;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.yssoft.entity.core.TProductClassify;
import com.yssoft.mapper.core.TProductClassifyMapper;
import com.yssoft.shiro.MyRealm.ShiroUser;
import com.yssoft.utils.UserHelper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @类名称: ProductClassifyService
 * @类描述: 产品类别service
 * @作者: 洪丰
 * @创建时间:2018年4月28日 下午2:11:42
 */
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Service
public class ProductClassifyService
{
	@Autowired
	protected TProductClassifyMapper productClassifyMapper;
	
	/**
	 * 获取唯一产品类别
	 * @方法名称: queryRoleById
	 * @功能描述: 
	 * @作者: 洪丰
	 * @创建时间: 2018年4月26日 下午7:51:30
	 * @param id
	 * @return TProductClassify
	 */
	public TProductClassify queryRoleById(Integer id){
		return productClassifyMapper.selectByPrimaryKey(id);
	}
	
	/**
	 * @方法名称: queryAllProClaTableTree
	 * @功能描述: 获取所有产品类别的列表树
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 下午2:01:13
	 * @return List<Map<String,Object>>
	 */
	public List<Map<String,Object>> queryAllProClaTableTree() {
        return  productClassifyMapper.queryProductClassifyAll();
    }
	
	/**
	 * @方法名称: addAcc
	 * @功能描述: 增加产品类别
	 * @作者: 洪丰
	 * @创建时间: 2018年4月26日 下午7:55:48
	 * @param entity void
	 */
	public void addAcc(TProductClassify entity) {
		entity.setDeleteFlag("0");
		ShiroUser user = UserHelper.getCurrentUser();
		entity.setCreatorId(user.getId());
		entity.setCreatorName(user.getPersonName());
		entity.setCreateTime(new Date());
		
		productClassifyMapper.insert(entity);
	}
	
	/**
	 * @方法名称: editAcc
	 * @功能描述: 修改产品类别
	 * @作者: 洪丰
	 * @创建时间: 2018年4月26日 下午8:05:55
	 * @param entity void
	 */
	public void editAcc(TProductClassify entity) {
		productClassifyMapper.updateByPrimaryKey(entity);
	}
	
	/**
	 * @方法名称: delAccById
	 * @功能描述: 删除生产类别及其子类别
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 下午2:44:55
	 * @param id void
	 */
	public void delAccById(Integer id) {
		TProductClassify entity = new TProductClassify();
		entity.setId(id);
		entity.setDeleteFlag("1");
		productClassifyMapper.updateByPrimaryKeySelective(entity);
		this.delClildrenAccById(id);
	}
	
	/**
	 * @方法名称: delClildrenAccById
	 * @功能描述: 递归删除子类
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 下午3:24:33
	 * @param id void
	 */
	public void delClildrenAccById(Integer id) {
		TProductClassify record = new TProductClassify();
		record.settPorCla(id);
		record.setDeleteFlag("0");
		List<TProductClassify> childrenList = productClassifyMapper.select(record);
		if(null != childrenList && childrenList.size() > 0){
			for(TProductClassify cEntity : childrenList){
				cEntity.setDeleteFlag("1");
				productClassifyMapper.updateByPrimaryKey(cEntity);
				this.delClildrenAccById(cEntity.getId());
			}
		}
	}
	
	/**
	 * @功能描述:查询生产范围树数据
	 * @作者:戈超
	 * @return
	 */
	public String queryProclaTree(String ids) {
		String[] id = ids.split(",");
		//获取生产范围一级节点
		List<Map<String, Object>> node = productClassifyMapper.queryProClaTreeOneNode();
		/*获取生产范围列表*/
		List<Map<String, Object>> proClaList = productClassifyMapper.queryProClaTreeAllNode();
		for(Map<String, Object> proCla : node){
			List<Map<String, Object>> children = queryProClaTreeNode(proCla.get("value").toString(), id, proClaList);
			proCla.put("data", children);
			for (String s : id) {
	            if (s.equals(proCla.get("value").toString())){
	            	proCla.put("checked", "true");
	            	break;
	            }
	        }
		}
		//查询结果转换json
		String jsonArray = JSONObject.toJSONString(node);
		return jsonArray;
	}
	
	/**
	 * @功能描述:递归查询一级生产范围下树形数据
	 * @作者:戈超
	 * @param pId
	 * @return
	 */
	public List<Map<String, Object>> queryProClaTreeNode(String pId, String[] id, List<Map<String, Object>> proClaList){
		List<Map<String, Object>> proClaNode = new ArrayList<>();
		for(Map<String, Object> map : proClaList){
			if(pId.equals(map.get("pId").toString())){
				List<Map<String, Object>> children = queryProClaTreeNode(map.get("value").toString(), id, proClaList);
				map.put("data", children);
				for (String s : id) {
		            if (s.equals(map.get("value").toString())){
		            	map.put("checked", "true");
		            	break;
		            }
		        }
				proClaNode.add(map);
			}
		}
		return proClaNode;
	}

	/**
	 * @功能描述:查询企业信息生产范围
	 * @作者:戈超
	 * @param id
	 * @return
	 */
	public Map<String, Object> queryProductByEntId(Integer id) {
		Map<String, Object> areaNode = productClassifyMapper.queryProductByEntId(id);
		return areaNode;
	}
	
	/**
	 * @方法名称: queryMyDeptTree
	 * @功能描述: 查询可选的上级tree数据
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 下午2:32:44
	 * @return List<Map<String,Object>>
	 */
    public List<Map<String,Object>> queryProClaTree() {
        List<Map<String,Object>> proClaList=null;
        proClaList= productClassifyMapper.queryProductClassifyNull();
        Iterator<Map<String,Object>> it = proClaList.iterator();
        List<Integer> genList=new ArrayList<>();
        while (it.hasNext()) {
            Map<String, Object> map1 = it.next();
            if (map1.get("pid") == null) {
                genList.add(Integer.parseInt(map1.get("id") + ""));
                for (Map<String, Object> map2 : proClaList) {
                    if (map2.get("pid")!=null && map2.get("pid").equals(map1.get("id"))) {
                        List<Map<String, Object>> childrens = (List<Map<String, Object>>) map1.get("children");
                        if (childrens == null) {
                            childrens = new ArrayList<>();
                        }
                        childrens.add(map2);
                        map1.put("children", childrens);
                    }
                }
            }else {
                for (Map<String, Object> map2 : proClaList) {
                    if (map2.get("id").equals(map1.get("pid")) && map2.get("pid") != null) {
                        List<Map<String, Object>> childrens = (List<Map<String, Object>>) map2.get("children");
                        if (childrens == null) {
                            childrens = new ArrayList<>();
                        }
                        childrens.add(map1);
                        map2.put("children", childrens);
                    }
                }
            }
        }
        Iterator<Map<String,Object>> it2 = proClaList.iterator();
        while (it2.hasNext()) {
            Map<String,Object> map = it2.next();
            if(map.get("pid")!=null){
                it2.remove();
            }
        }
        return proClaList;
    }
}
